閉包是包含在函數的程式碼,可以在程式碼中被傳遞和使用,也被稱為匿名函數。
{ (parameters) -> return type in
statements
}
// 這個函數式計算某個整數的平方
func myFunc(param: Int) -> Int {
return param * param
}
// 閉包的建立方式
let myClosures = {(param: Int) -> Int in
return param * param
}
閉包在語法上,由in關鍵字來進行分割
// 對函數進行呼叫,返回9
myFunc(param: 3)
// 對閉包進行呼叫,返回9
myClosures(3)
與函數不同的是,閉包的返回值是可以省略的。
// 閉包的建立方式
let myClosures1 = {(param: Int) in
return param * param
}
根據上下文推測型別
通過內聯閉包運算式所構造的閉包作為參數傳遞給函數時,都可以推測出閉包的參數和返回值的型別,所以就可以拿掉「小括號」和「參數型別」。
尾隨閉包
假設開發時需要將一個很長的閉包作為參數傳遞給函數,可以利用尾隨閉包,來讓提升整體程式碼的可讀性。
// 原結構
mySort(array: &stuArr, sortClosure: {
($0 as! Student).achievement > ($1 as! Student).achievement
})
// 尾隨閉包
mySort(array: &stuArr){
($0 as! Student).achievement > ($1 as! Student).achievement
}
可以在進行簡化
func myFunc(closure:() -> ()) {
}
// 閉包的型別為 () -> () 沒有參數也沒有返回值
// 使用尾隨閉包進行函式呼叫
myFunc() {
}
// 如果函式只有閉包這一個參數時,甚或是可以將函式的()省略,修改如下:
myFunc {
}
逃逸閉包
在一般情況下,函數參數中的閉包都為非逃逸閉包,但開發者可以根據實際需求將閉包參數,宣告為逃逸閉包。逃逸閉包指的是當一個閉包作為參數傳到一個參數中,但是這個閉包在函數返回之後才被執行,我們就稱閉包從函數中逃逸,開發者可以在參數前標示@escaping用來表示這個閉包是被允許逃逸出這個函數的。
var closures1: [() -> Void] = []
func escapingFunc(clousures: @escaping () -> Void) {
closures1.append(clousures)
}
自動閉包
不是每個閉包都需要顯式建立的,Swift中還有一種叫做自動閉包,但自動閉包的參數有嚴格的條件,首先此閉包不能有參數,其次在調用函數傳參數時,只能用一句來組成,自動閉包的參數由@autoclosure來宣告。
// 宣告為自動閉包
func myFunc(clousure: @autoclosure () -> Bool) {
}
// 呼叫傳入一個表達式
myFunc(clousure: 1+2+3>10)
// 將閉包宣告為自動閉包與逃逸閉包
func myFunc(clousure: @autoclosure @escaping ()->Bool) {
}
接下來,是列舉的介紹